package sifeap.dal.ejb.solicitudescredito;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import sifeap.dal.ejb.AbstractFacade;
import sifeap.entities.solicitudescredito.SolicitudCredito;
import sifeap.entities.solicitudescredito.valueobject.SolicitudCreditoVO;
import sifeap.exception.SifeapException;

/**
 * Session Bean implementation class EventoBL
 */
@Stateless(name="SolicitudCreditoDAL")
public class SolicitudCreditoDAL extends AbstractFacade<SolicitudCredito> implements SolicitudCreditoDALLocal {

	@PersistenceContext(unitName = "sifeapPU")
	private EntityManager em;
	
    /**
     * Default constructor. 
     */
    public SolicitudCreditoDAL() {
    	super(SolicitudCredito.class);
    }

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}

	@Override
	public List<SolicitudCredito> buscarSolicitudes(SolicitudCreditoVO solicitudCreditoVo, boolean misSolicitudes) {
		List<SolicitudCredito> listaSolicitudes;
		String sqlString = null;
		
		if (misSolicitudes) {
			sqlString = this.obtenerConsulta("misSolicitudesCredito");
		} else {
			sqlString = this.obtenerConsulta("consultarSolicitudesCredito");
		}

		//Arma el query
		if (solicitudCreditoVo != null) {
			if (solicitudCreditoVo.getSolicitudCredito() != null) {
				if (solicitudCreditoVo.getSolicitudCredito().getVincedula() != null 
						&& solicitudCreditoVo.getSolicitudCredito().getVincedula().trim().length() > 0) {
					//Tiene cedula
					sqlString = sqlString.concat(" and solcred.vincedula = '".concat(solicitudCreditoVo.getSolicitudCredito().getVincedula()).concat("' "));
				}
				
				if (solicitudCreditoVo.getSolicitudCredito().getEstadoscredito() != null
						&& solicitudCreditoVo.getSolicitudCredito().getEstadoscredito().getIdEstadoCredito() != null
						&& solicitudCreditoVo.getSolicitudCredito().getEstadoscredito().getIdEstadoCredito() > 0) {
					//Tiene estado de solicitud
					sqlString = sqlString.concat(" and solcred.idestadocredito = ".concat(String.valueOf(solicitudCreditoVo.getSolicitudCredito().getEstadoscredito().getIdEstadoCredito())));
				}
			}
			DateFormat formatter = null;
			if (solicitudCreditoVo.getFechaInicio() != null) {
				formatter = new SimpleDateFormat("yyyy-MM-dd");
				sqlString = sqlString.concat(" and solcred.fechasolicitud >= '".concat(formatter.format(solicitudCreditoVo.getFechaInicio())).concat(" 00:00:00'"));
			}
			
			if (solicitudCreditoVo.getFechaFin() != null) {
				if (formatter == null) {
					formatter = new SimpleDateFormat("yyyy-MM-dd");
				}
				sqlString = sqlString.concat(" and solcred.fechasolicitud <= '".concat(formatter.format(solicitudCreditoVo.getFechaFin())).concat(" 23:59:59'"));
			}
		}
		
		sqlString = sqlString.concat(" order by solcred.fechasolicitud desc");
		
		Query query = em.createNativeQuery(sqlString, SolicitudCredito.class);
		query.setHint("javax.persistence.cache.storeMode", "REFRESH");
		
		listaSolicitudes = query.getResultList();
		
		return listaSolicitudes;
	}

	@Override
	public boolean eliminarRegistrosAsociados(long idSolicitudCredito) throws SifeapException {
		boolean resultado = false;
		
		try {
			
			//Elimina registros de SOPORTESCODEUDOR
			Query query = em.createNamedQuery("eliminarSoportesCodeudor");
			query.setParameter(1, idSolicitudCredito);
			query.executeUpdate();
			
			//Elimina registros de CODEUDOR
			query = em.createNamedQuery("eliminarCodeudores");
			query.setParameter(1, idSolicitudCredito);
			query.executeUpdate();
			
			//Elimina de SOPORTESCREDITO
			query = em.createNamedQuery("eliminarSoportesCredito");
			query.setParameter(1, idSolicitudCredito);
			query.executeUpdate();
			
			resultado = true;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
		
		return resultado;
	}

	@Override
	public boolean asociarSoportesCredito(long idSolicitudCredito, Long idSoporte) throws SifeapException {
		boolean resultado = false;
		
		try {
			Query query = em.createNamedQuery("insertarSoportesCredito");
			query.setParameter(1, idSolicitudCredito);
			query.setParameter(2, idSoporte);
			query.executeUpdate();
			
			resultado = true;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
		
		return resultado;
	}

	@Override
	public boolean asociarSoportesCodeudor(Long idCodeudor, Long idSoporte) throws SifeapException {
		boolean resultado = false;
		
		try {
			Query query = em.createNamedQuery("insertarSoportesCodeudor");
			query.setParameter(1, idCodeudor);
			query.setParameter(2, idSoporte);
			query.executeUpdate();
			
			resultado = true;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
		
		return resultado;
	}

	@Override
	public boolean cambiarEstadoSolicitud(long idSolicitudCredito, Long estadoCredito, String comentario) throws SifeapException {
		boolean resultado = false;
		
		try {
			Query query = em.createNamedQuery("cambiarEstadoSolicitudCredito");
			query.setParameter(1, estadoCredito);
			query.setParameter(2, comentario);
			query.setParameter(3, idSolicitudCredito);
			query.executeUpdate();
			
			resultado = true;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
		
		return resultado;
	}
}
